<?php
namespace Common\Model;

/**
 * 日志记录模型，使用该模型进行记录日志等信息
 */
class LogModel extends AllModel{

    /**
     * 前端用户注册操作
     * 
     * @param string $uid 注册用户的唯一标识
     * @return number 是否记录成功
     * @author xiaoyutab<xiaoyutab@qq.com>
     * @version v1.0.0
     * @copyright (c) 2017, xiaoyutab
     * @adtime 2018-03-28 15:29:38
     */
    public function user_reg($uid = false){
        if($uid <= 0){
            return FALSE;
        }
        return $this->_create_date(array(
            'user_type' => 2,
            'user_name' => 'user',
            'old_key' => $uid,
            'uid' => 0,
        ));
    }
    
    /**
     * 用户登录时密码输入错误
     * 
     * @param string $username 登录用户输入的用户名
     * @return number 是否记录成功
     * @author xiaoyutab<xiaoyutab@qq.com>
     * @version v1.0.0
     * @copyright (c) 2017, xiaoyutab
     * @adtime 2018-03-28 15:29:38
     */
    public function password_error($username = ''){
        if(empty($username)){
            return FALSE;
        }
        return $this->_create_date(array(
            'user_type' => 7,
            'user_name' => 'user',
            'tab_key' => $username,
            'old_key' => 0,
            'uid' => 0,
        ));
    }

    /**
     * 前端用户登录操作
     * 
     * @param string $uid 注册用户的唯一标识
     * @return number 是否记录成功
     * @author xiaoyutab<xiaoyutab@qq.com>
     * @version v1.0.0
     * @copyright (c) 2017, xiaoyutab
     * @adtime 2018-03-28 15:32:16
     */
    public function user_login($uid = false,$type = 0){
        if($uid <= 0){
            return FALSE;
        }
        return $this->_create_date(array(
            'user_type' => 1,
            'user_name' => 'user',
            'old_key' => $uid,
            'uid' => intval($type),// 如果是登录类型,则uid标识用户登录的设备类型
            // 关联C('type_config.TokenType')
        ));
    }

    /**
     * 前端用户重置密码操作
     * 
     * @param string $uid 注册用户的唯一标识
     * @return number 是否记录成功
     * @author xiaoyutab<xiaoyutab@qq.com>
     * @version v1.0.0
     * @copyright (c) 2017, xiaoyutab
     * @adtime 2018-03-28 15:32:24
     */
    public function user_pass($uid = false){
        if($uid <= 0){
            return FALSE;
        }
        return $this->_create_date(array(
            'user_type' => 3,
            'user_name' => 'user',
            'old_key' => $uid,
            'uid' => 0,
        ));
    }

    /**
     * 前端用户退出系统操作
     * 
     * @param string $uid 注册用户的唯一标识
     * @return number 是否记录成功
     * @author xiaoyutab<xiaoyutab@qq.com>
     * @version v1.0.0
     * @copyright (c) 2017, xiaoyutab
     * @adtime 2018-03-28 15:33:02
     */
    public function user_logout($uid = false){
        if($uid <= 0){
            return FALSE;
        }
        return $this->_create_date(array(
            'user_type' => 4,
            'user_name' => 'user',
            'old_key' => $uid,
            'uid' => 0,
        ));
    }

    /**
     * 后台用户登录系统操作
     *      因现在前端用户和后台用户用的是一套用户系统，所以此处判断用户的admin_group字段来确定是否能登录后台
     * 
     * @param string $uid 注册用户的唯一标识
     * @return number 是否记录成功
     * @author xiaoyutab<xiaoyutab@qq.com>
     * @version v1.0.0
     * @copyright (c) 2017, xiaoyutab
     * @adtime 2018-03-28 15:33:02
     */
    public function user_login_admin($uid = false){
        if($uid <= 0){
            return FALSE;
        }
        return $this->_create_date(array(
            'user_type' => 5,
            'user_name' => 'user',
            'old_key' => $uid,
            'uid' => 2,
        ));
    }

    /**
     * 后台用户修改密码操作
     * 
     * @param string $uid 注册用户的唯一标识
     * @return number 是否记录成功
     * @author xiaoyutab<xiaoyutab@qq.com>
     * @version v1.0.0
     * @copyright (c) 2017, xiaoyutab
     * @adtime 2018-05-02 16:49:21
     */
    public function user_password_admin($uid = false){
        if($uid <= 0){
            return FALSE;
        }
        return $this->_create_date(array(
            'user_type' => 8,
            'user_name' => 'user',
            'old_key' => $uid,
            'uid' => 2,
        ));
    }

    /**
     * 后台用户退出系统操作
     *      因现在前端用户和后台用户用的是一套用户系统，所以此处判断用户的admin_group字段来确定是否能登录后台
     * 
     * @param string $uid 注册用户的唯一标识
     * @return number 是否记录成功
     * @author xiaoyutab<xiaoyutab@qq.com>
     * @version v1.0.0
     * @copyright (c) 2017, xiaoyutab
     * @adtime 2018-03-28 15:33:02
     */
    public function user_logout_admin($uid = false){
        if($uid <= 0){
            return FALSE;
        }
        return $this->_create_date(array(
            'user_type' => 6,
            'user_name' => 'user',
            'old_key' => $uid,
            'uid' => 0,
        ));
    }
    
    /**
     * 创建日志
     * 
     * @param type $option
     */
    public function create_log($option = array()){
        $default = array(
            'user_type' => 97,
            'user_name' => 'log',
            'old_key' => 1,
            'uid' => session('u_info.id'),
        );
        return $this->_create_date(array_merge($default,$option));
    }
    
    /**
     * 创建其他类型的插入日志
     * 
     * @param type $id
     * @param type $tab
     * @return type
     */
    public function create_oth_log($id = 0,$tab = ''){
        $default = array(
            'user_type' => 97,
            'user_name' => $tab,
            'old_key' => $id,
            'uid' => session('u_info.id'),
        );
        return $this->_create_date($default);
    }
    
    /**
     * 创建其他类型的删除日志
     * 
     * @param type $id
     * @param type $tab
     * @return type
     */
    public function delete_admin_log($id = 0,$tab = ''){
        $default = array(
            'user_type' => 99,
            'user_name' => $tab,
            'old_key' => $id,
            'uid' => session('u_info.id'),
        );
        return $this->_create_date($default);
    }
    
    /**
     * 记录更新表的日志
     * 
     * @param string $tab_name 表名
     * @param array $new 操作后的值
     * @param array $old 操作前的值
     * @return Boolean 是否修改成功
     */
    public function update_admin_date($tab_name = '',$new = array(),$old = array()){
        $tab_key = $old_val = $new_val = array();
        foreach($new as $k => $v){
            if(is_array($v)){
                $v = implode(',', $v);// 如果传入的新值时数组,使用英文半角逗号拼接上
            }
            if($v != $old[$k]){
                // 如果新旧值不同
                $tab_key[] = str_replace(',', '|', $k);
                $old_val[] = str_replace(',', '|', $old[$k]);
                $new_val[] = str_replace(',', '|', $v);
            }
        }
        if(empty($new_val) && empty($old_val)){
            return FALSE;
        }
        return $this->_create_date(array(
            'uid' => session('u_info.id'),
            'user_name' => $tab_name,
            'old_key' => $old['id'],
            'user_type' => 98,
            'tab_key' => implode(',', $tab_key),// 修改的字段
            'old_val' => implode(',',$old_val),
            'new_val' => implode(',',$new_val),
        ));
    }

    /**
     * 执行添加操作，需要传入一个数组，其中必须要传入以下几点：
     *      user_type：操作类型：
     *          1前端用户登录，2前端用户注册，3前端用户找回密码，4前端用户退出，
     *          5后台用户登录，6后台用户退出，
     *          97其他添加操作，98其他更新操作，99其他删除操作
     *      user_name：操作的表名，不带前缀
     *      old_key：修改的表的主键编号
     *      tab_key：修改表中的哪几个字段，英文半角逗号区分
     *      old_val：表中的旧的值，英文半角逗号分割
     *      new_val：更新成的值，英文半角逗号分割
     *      uid:登录用户的ID
     * 
     * @return number 是否记录成功
     * @author xiaoyutab<xiaoyutab@qq.com>
     * @version v1.0.0
     * @copyright (c) 2017, xiaoyutab
     * @adtime 2017-07-12 18:03:57
     */
    private function _create_date($arr = array()){
        // 如果传入的不是数组就直接返回false
        if(!is_array($arr)){
            return FALSE;
        }
        // 如果必须要传入的这六个字段没有传入则返回false
        if(!isset($arr['user_type'],$arr['user_name'],$arr['old_key'])){
            return FALSE;
        }
        $log_info = new LogInfoModel();
        // 获取用户的HTTP_USER_AGENT标识
        $user_agent = $_SERVER['HTTP_USER_AGENT'];
        $arr['user_agent'] = $log_info->get_id($user_agent);
        // 获取用户的IP地址及城市
        $ip = get_client_ip();
        $temp_ip = new \Org\User\IpCity();
        $city = $temp_ip->getCity($ip);
        $city || $city = '本地测试';
        $arr['ad_ip'] = $log_info->get_id($ip);
        $arr['ip_city'] = $log_info->get_id($city);
        // 获取用户的系统及浏览器版本信息
        $sys = new \Org\User\System();
        $brow = $sys->get_browser($user_agent, ',');
        $system = $sys->get_system($user_agent);
        $arr['browser'] = $log_info->get_id($brow);
        $arr['user_name'] = $log_info->get_id($arr['user_name']);
        $arr['system'] = $log_info->get_id($system);
        $arr['ad_time'] = NOW_TIME;
        return $this->add($arr);
    }
    
    /**
     * 根据表编号及ID列表获取最终修改的一条记录信息
     * 
     * @param string $tab 表名
     * @param array $key 主键编号
     * @param int $type 查询日志类型
     */
    public function get_table_last($tab = '',$key = array(),$type = 3){
        if(empty($tab)){
            return FALSE;
        }
        if(empty($key) || !is_array($key)){
            // 如果传入的主键不是数组且不是数字，直接返回false
            if(!is_numeric($key)){
                return FALSE;
            }
            $key = array($key);
        }
        if(!empty($type) && !is_array($type)){
            if($type > 100 || $type <= 0){
                return FALSE;
            }
            $type = array($type);
        }
        $log_info = new LogInfoModel();
        $info = $this->where(array(
            'user_name' => $log_info->get_id($tab),
            'old_key' => array('in',$key),
            'user_type' => array('in',$type)
        ))->order('`id` DESC')->cache(true)->find();
        return $info;
    }
}